"""Given the root of a binary tree, return the most frequent subtree sum. If there is a tie, return all the values with the highest frequency in any order.

The subtree sum of a node is defined as the sum of all the node values formed by the subtree rooted at that node (including the node itself).

 

Example 1:


Input: root = [5,2,-3]
Output: [2,-3,4]
Example 2:


Input: root = [5,2,-5]
Output: [2]
 

Constraints:

The number of nodes in the tree is in the range [1, 104].
-105 <= Node.val <= 105"""
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int dfs(TreeNode* root, vector<int>& sums) {
        if (!root) return 0;
        int res = root->val + dfs(root->left, sums) +dfs(root->right, sums);
        sums.push_back(res);
        return res;
    }
    vector<int> findFrequentTreeSum(TreeNode* root) {
        vector<int> sums;
        dfs(root, sums);
        unordered_map<int, int> freq;
        for (const auto &it : sums) freq[it]++;
        int max_freq = 0;
        for (auto it = freq.begin(); it!=freq.end(); it++) {
            if (it->second >= max_freq) max_freq = it->second;
        }
        vector<int> res;
        for (auto it = freq.begin(); it!=freq.end(); it++) {
            if (it->second == max_freq) res.push_back(it->first);
        }
        return res;
    }
};